package com.sinoatma.physignsmonitor.utils

import android.graphics.Bitmap
import java.io.Closeable
import java.io.File
import java.io.FileOutputStream

/**
 * @ProjectName : NewConsultation
 * @Author :
 * @Time : 2023/10/19 11:26
 * @Description : 文件描述
 */
object FileUtils {
    /**
     * 保存位图到指定路径
     */
    fun onSaveBitmapTo(bitmap: Bitmap?, path: String?): Boolean {
        if (bitmap == null) {
            return false
        }
        var out: FileOutputStream? = null
        return try {
            val file = File(path)
            if (!file.exists() || file.delete()) {
                out = FileOutputStream(path)
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
            }
            true
        } catch (e: Exception) {
            false
        } finally {
            close(out)
        }
    }

    /**
     * 关闭流对象
     */
    fun close(closeable: Closeable?) {
        try {
            closeable?.close()
        } catch (e: Exception) {
            // Nothing need to do
        }
    }

    /** 删除目录及目录下的文件
     * @param filePath 要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    fun deleteDirectory(filePath: String): Boolean {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        var filePath = filePath
        if (!filePath.endsWith(File.separator)) filePath += File.separator
        val dirFile = File(filePath)
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory) {
//            HnLogUtils.e("删除目录失败：" + filePath + "不存在！")
            return false
        }
        var flag = true
        // 删除文件夹中的所有文件包括子目录
        val files: Array<File> = dirFile.listFiles()
        for (file in files) {
            // 删除子文件
            if (file.isFile()) {
                flag = deleteSingleFile(file.absolutePath)
                if (!flag) break
            } else if (file.isDirectory) {
                flag = deleteDirectory(
                    file.absolutePath
                )
                if (!flag) break
            }
        }
        if (!flag) {
            return false
        }
        // 删除当前目录
        return dirFile.delete()
    }

    /** 删除单个文件
     *
     * @return 单个文件删除成功返回true，否则返回false
     */
    fun deleteSingleFile(`filePath$Name`: String): Boolean {
        val file = File(`filePath$Name`)
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        return if (file.exists() && file.isFile) {
            file.delete()
        } else {

            false
        }
    }

    /**
     * 根据文件路径获取 File 对象
     * @param filePath 文件的路径
     * @return 如果文件存在则返回对应的 File 对象，否则返回 null
     */
    fun getFileFromPath(filePath: String): File? {
        return try {
            val file = File(filePath)
            if (file.exists()) {
                file
            } else {
                null
            }
        } catch (e: Exception) {
            // 处理可能出现的异常，如路径格式错误等
            println("获取文件时出现错误: ${e.message}")
            null
        }
    }

    /**
     * 判断字符串第一行的尾部是否以指定的后缀结尾
     * @param multiLineString 包含多行的字符串
     * @param suffix 要检查的后缀
     * @return 如果第一行以指定后缀结尾返回 true，否则返回 false
     */
    fun isFirstLineEndsWith(multiLineString: String, suffix: String): Boolean {
        // 查找第一行的结尾
        val endIndex = multiLineString.indexOf('\n').takeIf { it != -1 } ?: multiLineString.length
        // 提取第一行
        val firstLine = multiLineString.substring(0, endIndex)
        return firstLine.endsWith(suffix)
    }


}